package UI;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener, ActionListener {

    //二维数组
    int[][] data = new int[4][4];

    //记录空白方块的位置
    int x = 0;
    int y = 0;

    String path = "src\\Image\\girl\\girl3\\";

    int win[][] = {
            {1, 2, 3, 4},
            {5, 6, 7, 8},
            {9, 10, 11, 12},
            {13, 14, 15, 0}
    };

    //创建条目
    JMenuItem replay = new JMenuItem("重新游戏");
    JMenuItem relogin = new JMenuItem("重新登陆");
    JMenuItem close = new JMenuItem("关闭游戏");

    JMenuItem account = new JMenuItem("公众号");

    JMenuItem beauty=new JMenuItem("美女");
    JMenuItem animal=new JMenuItem("动物");
    JMenuItem sport =new JMenuItem("运动");


    int step = 0;

    public GameJFrame() {
        this.setSize(603, 680);

        //初始化界面
        InitJFrame();

        //初始化菜单
        InitMenu();

        InitData();

        //初始化图片
        InitImage();

        //显示界面 建议写在最后
        this.setVisible(true);
    }

    private void InitData() {
        int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};

        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
            int index = r.nextInt(arr.length);

            int tmp = arr[i];
            arr[i] = arr[index];
            arr[index] = tmp;
        }

        //给二维数组添加数据
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == 0) {
                x = i / 4;
                y = i % 4;
            }
            data[i / 4][i % 4] = arr[i];
        }
    }

    private void InitImage() {
        this.getContentPane().removeAll();

        //判断是否胜利
        if (victory()) {
            JLabel win = new JLabel(new ImageIcon("src\\Image\\win.png"));
            win.setBounds(203, 283, 197, 73);
            this.getContentPane().add(win);
        }

        ////        可以直接放到jLabel当中
        ////        //创建ImageIcon对象
        ////        ImageIcon icon = new ImageIcon("D:\\24oo\\code\\Project144_10_7\\Image\\animal\\animal3\\3.jpg");
        //
        //        //创建JLabel管理容器
        //        JLabel jLabel = new JLabel(new ImageIcon("D:\\24oo\\code\\Project144_10_7\\Image\\animal\\animal3\\3.jpg"));
        //
        //        //指定位置
        //        jLabel.setBounds(0,0,105,105);
        //
        //
        ////        //管理容器添加到界面
        ////        this.add(jLabel);
        //        //调用隐藏容器 把图片传给隐藏容器
        //        this.getContentPane().add(jLabel);

        JLabel stepJLabel = new JLabel("步数" + step);
        stepJLabel.setBounds(50, 30, 100, 20);
        this.getContentPane().add(stepJLabel);

        //先加载的图片在上方 后加载的在下方
        //可以写成循环的格式
        //添加图片
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                int num = data[i][j];
                //创建JLabel管理容器
                JLabel jLabel = new JLabel(new ImageIcon(path + num + ".jpg"));

                //指定位置
                jLabel.setBounds(105 * j + 83, 105 * i + 134, 105, 105);

                //添加边框
                jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));

                //调用隐藏容器 把图片传给隐藏容器
                this.getContentPane().add(jLabel);
            }
        }

        //初始化背景
        JLabel background = new JLabel(new ImageIcon("src\\Image\\background.png"));
        background.setBounds(40, 40, 508, 560);
        this.getContentPane().add(background);


        //刷新
        this.getContentPane().repaint();
    }


    private void InitMenu() {
        //创建菜单对象
        JMenuBar jMenuBar = new JMenuBar();

        //菜单选项
        JMenu function = new JMenu("功能");
        JMenu aboutUs = new JMenu("关于我们");

        //嵌套更换图片
        JMenu ImageChange=new JMenu("更换图片");

        //添加条目
        ImageChange.add(beauty);
        ImageChange.add(animal);
        ImageChange.add(sport);

        //条目添加到选项
        function.add(ImageChange);//嵌套
        function.add(replay);
        function.add(relogin);
        function.add(close);

        aboutUs.add(account);

        //选项添加到菜单
        jMenuBar.add(function);
        jMenuBar.add(aboutUs);

        //绑定监听事件
        replay.addActionListener(this);
        relogin.addActionListener(this);
        close.addActionListener(this);
        account.addActionListener(this);
        beauty.addActionListener(this);
        animal.addActionListener(this);
        sport.addActionListener(this);



        //最后一步类似于可视化工作的放置菜单
        this.setJMenuBar(jMenuBar);
    }

    private void InitJFrame() {
        this.addKeyListener(this);

        //标题
        this.setTitle("拼图游戏 V0.99");

        //置顶
        this.setAlwaysOnTop(true);

        //界面居中
        this.setLocationRelativeTo(null);

        //关闭模式
        this.setDefaultCloseOperation(3);

        //取消默认布局模式（居中） 取消后才是按XY布局的模式
        this.setLayout(null);
    }

    public boolean victory() {
        for (int i = 0; i < data.length; i++) {
            for (int i1 = 0; i1 < data[i].length; i1++) {
                if (data[i][i1] != win[i][i1]) {
                    return false;
                }
            }
        }
        return true;

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {

        int code = e.getKeyCode();
        if (code == 65) {
            this.getContentPane().removeAll();

            JLabel all = new JLabel(new ImageIcon(path + "all.jpg"));
            all.setBounds(83, 134, 420, 420);
            this.getContentPane().add(all);

            //初始化背景
            JLabel background = new JLabel(new ImageIcon("src\\Image\\background.png"));
            background.setBounds(40, 40, 508, 560);
            this.getContentPane().add(background);

            //刷新
            this.getContentPane().repaint();
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if (victory()) {
            return;
        }
        //37 38 39 40
        int code = e.getKeyCode();
        if (code == 37) {
            System.out.println("向左移动");

            if (y == 3) {
                return;
            }
            data[x][y] = data[x][y + 1];
            data[x][y + 1] = 0;
            y++;

            //计步器
            step++;
            InitImage();
        } else if (code == 38) {
            System.out.println("向上移动");

            if (x == 3) {
                return;
            }
            data[x][y] = data[x + 1][y];
            data[x + 1][y] = 0;
            x++;

            step++;
            InitImage();

        } else if (code == 39) {
            System.out.println("向右移动");

            if (y == 0) {
                return;
            }
            data[x][y] = data[x][y - 1];
            data[x][y - 1] = 0;
            y--;

            step++;
            InitImage();
        } else if (code == 40) {
            System.out.println("向下移动");

            if (x == 0) {
                return;
            }
            data[x][y] = data[x - 1][y];
            data[x - 1][y] = 0;
            x--;

            step++;
            InitImage();
        } else if (code == 65) {
            InitImage();
        } else if (code == 87) {
            data = new int[][]{
                    {1, 2, 3, 4},
                    {5, 6, 7, 8},
                    {9, 10, 11, 12},
                    {13, 14, 15, 0}
            };
            x = 3;
            y = 3;
            InitImage();
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        //获取被点击的条目
        Object obj=e.getSource();

        if(obj==replay){
            step=0;
            InitData();
            InitImage();

        }else if(obj==relogin){
            this.setVisible(false);
            new LoginJFrame();

        }else if(obj==close){
            System.exit(0);

        }else if(obj==account){

            //弹窗
            JDialog quote=new JDialog();
            JLabel jLabel=new JLabel(new ImageIcon("src\\Image\\about.png"));
            jLabel.setBounds(0,0,258,258);

            //把jLabel添加到JDialog的隐藏容器当中
            quote.getContentPane().add(jLabel);

            //设置JDialog的大小
            quote.setSize(340,340);

            //置顶
            quote.setAlwaysOnTop(true);

            //居中
            quote.setLocationRelativeTo(null);

            //如果不关闭当前窗口就无法操作
            quote.setModal(true);

            //可视化
            quote.setVisible(true);

        } else if(obj==beauty){
            Random r=new Random();
            int opt=r.nextInt(13)+1;
            path="src\\Image\\girl\\girl"+opt+"\\";
            step=0;
            InitData();
            InitImage();

        } else if(obj==animal){
            Random r=new Random();
            int opt=r.nextInt(8)+1;
            path="src\\Image\\animal\\animal"+opt+"\\";
            step=0;
            InitData();
            InitImage();
        }else if(obj==sport){
            Random r=new Random();
            int opt=r.nextInt(10)+1;
            path="src\\Image\\sport\\sport"+opt+"\\";
            step=0;
            InitData();
            InitImage();
        }

    }
}
